/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 17655
 * Date: 2025-02-04
 * Time: 21:45
 */
public class test3 {
    /**
     * LeetCode 34 在排序数组中查找元素的第一个和最后一个位置
     */

    /**
     * 正常解法
     */

    public int[] searchRange(int[] nums, int target) {
        // leftIndex是第一个大于等于target的数
        int leftIndex = binarySearch(nums,target,true);
        // rightIndex是第一个大于target的数减一
        int rightIndex = binarySearch(nums,target,false)-1;
        if(leftIndex<=rightIndex && rightIndex< nums.length && nums[leftIndex] == target
                && nums[rightIndex]==target){
            return new int[] {leftIndex,rightIndex};
        }
        return new int[]{-1,-1};
    }

    // tower的作用是判断是找第一个大于等于target的数，还是找第一个大于target的下标（找leftIndex还是rightIndex）
    public int binarySearch(int [] nums,int target,boolean lower){
        int left=0;
        // 利用ans记录位置
        int ans =nums.length;
        int right=nums.length-1;
        while(left<=right){
            int mid = left+(right-left)/2;
            // 判断条件
            // 前面一个是找第一个大于target的下标，后面是找第一个大于等于target的下标
            if(nums[mid]>target || (lower && nums[mid]>=target)){
                right=mid-1;
                ans=mid;
            }else{
                left=mid+1;
            }
        }
        return ans;
    }
}
